package org.example.Controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.example.entity.BorrowDetail;
import org.example.service.BorrowService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Collections;

@RestController
public class BorrowController {

    @Resource
    BorrowService borrowService;

    /**
     * 服务调用失败后调用降级处理方法findUserBorrowsError，
     * 此@HystrixCommand服务降级处理机制和41的findUserBorrowsFeign方法的服务降级处理机制功能类似，
     * 人选一种即可
     **/
    @HystrixCommand(fallbackMethod = "findUserBorrowsError")
    @RequestMapping("/borrow/{uid}")
    public BorrowDetail findUserBorrows(@PathVariable("uid") int uid){
        return borrowService.getUserBorrowDetailByUid(uid);
    }

    /**
     * 在服务发生异常时进行应急处理，不是服务卡死堆积，造成服务性能下降
     * 此处的返回对象要和实际调用方法的返回对象一致，在findUserBorrows方法中调用
     * @param uid
     * @return
     */
    public BorrowDetail findUserBorrowsError(int uid){
        return new BorrowDetail(null, Collections.emptyList());
    }

    /**
     * 此方法主要体现feign处理服务降级的机制，对比HystrixCommand学习
     * 和21行findUserBorrows方法中的@HystrixCommand处理机制，人选一个即可
     * @param uid
     * @return
     */
    @RequestMapping("/borrowfeign/{uid}")
    public BorrowDetail findUserBorrowsFeign(@PathVariable("uid") int uid){
        return borrowService.getUserBorrowDetailByUid(uid);
    }
}
